package com.zw.a.basic.a11.demo04_exercise;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

//Map案例: HashMap嵌套ArrayList
public class Demo04 {
    public static void main(String[] args) {
        //1.创建一个HashMap集合，存储三个键值对元素，键表示书名(String)，值是书中人物名(ArrayList<String>)
        HashMap<String, ArrayList<String >> hm = new HashMap<>();
        //2.第一个ArrayList集合的元素: (三国演义)
        // 诸葛亮
        // 赵云
        ArrayList<String> sgyy = new ArrayList<>();
        sgyy.add("诸葛亮");
        sgyy.add("赵云");

        //3.第二个ArrayList集合的元素: (西游记)
        // 唐僧
        // 孙悟空
        ArrayList<String> xyj = new ArrayList<>();
        xyj.add("唐僧");
        xyj.add("孙悟空");

        //4.第三个ArrayList集合的元素: (水浒传)
        // 武松
        // 鲁智深
        ArrayList<String> shz = new ArrayList<>();
        shz.add("武松");
        shz.add("鲁智深");

        //5. 把元素填充到双列集合中.
        hm.put("三国演义", sgyy);
        hm.put("西游记", xyj);
        hm.put("水浒传", shz);

        //6.遍历HashMap集合, 输出每一个元素.
        //方式一: 根据键获取值.
        //6.1 获取所有的键.
        Set<String> keys = hm.keySet();
        //6.2 遍历, 获取到每一个键:  String
        for (String key : keys) {
            //6.3 输出键
            System.out.println(key);
            //6.4 根据键获取其对应的值: ArrayList<String>, 接着遍历.
            ArrayList<String> values = hm.get(key);
            //6.5 因为值还是一个单列集合, 所以接着遍历.
            for (String value : values) {
                //6.6 获取到每一个具体的值, 然后输出.
                System.out.println("\t" + value);
            }
        }

        System.out.println("----------------------------");
        //方式二: 根据键值对对象获取键和值.
        //6.1 获取所有的键.
        Set<Map.Entry<String, ArrayList<String>>> entrys = hm.entrySet();
        //6.2 遍历, 获取到每一个键:  String
        for (Map.Entry<String, ArrayList<String>> entry : entrys) {
            //6.3 输出键
            System.out.println(entry.getKey());
            //6.4 获取值: ArrayList<String>, 接着遍历.
            ArrayList<String> values = entry.getValue();
            //6.5 因为值还是一个单列集合, 所以接着遍历.
            for (String value : values) {
                //6.6 获取到每一个具体的值, 然后输出.
                System.out.println("\t" + value);
            }
        }
    }
}
